home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / TOOLPAS2 / MAPSIZE.PAS < prev    next >
Pascal/Delphi Source File  |  1990-11-27  |  3KB  |  159 lines

  1.  
  2. (*
  3.  * mapsize - filter to append sizes to lines of LINK .MAP files
  4.  *
  5.  * shs 19-mar-86 (rev. 15-may-87)
  6.  *
  7.  *)
  8.  
  9. type
  10.    anystring = string[128];
  11.  
  12. var
  13.    fd:         text;
  14.    CurLine:    anystring;
  15.    NextLine:   anystring;
  16.    CurSeg:     string[20];
  17.  
  18. type
  19.    segment_info = record
  20.       para: word;
  21.       name: string[20];
  22.    end;
  23.  
  24. const
  25.    maxseg = 200;
  26.  
  27. var
  28.    segment:    array[1..maxseg] of segment_info;
  29.    segments:   integer;
  30.  
  31.  
  32. function hex_to_long(hex: anystring): longint;
  33. var
  34.    i:   integer;
  35.    c:   char;
  36.    r:   longint;
  37.  
  38. begin
  39.    r := 0;
  40.    for i := 1 to length(hex) do
  41.    begin
  42.       r := r * 16 + ord(hex[i]) - ord('0');
  43.       if hex[i] > '9' then
  44.          r := r - 7;
  45.    end;
  46.  
  47.    hex_to_long := r;
  48. end;
  49.  
  50.  
  51. procedure process_segment;
  52. begin
  53.    inc(segments);
  54.    segment[segments].para := hex_to_long(copy(CurLine,2,4));
  55.    segment[segments].name := copy(CurLine,23,19);
  56. end;
  57.  
  58.  
  59. procedure determine_segment(para: word);
  60. var
  61.    i: integer;
  62. begin
  63.    for i := 1 to segments do
  64.       if segment[i].para = para then
  65.       begin
  66.          CurSeg := segment[i].name;
  67.          exit;
  68.       end;
  69. end;
  70.  
  71.  
  72. procedure process_item;
  73. var
  74.    CurAddr:    longint;
  75.    NextAddr:   longint;
  76.    NewSegment: boolean;
  77.    Overhead:   longint;
  78.  
  79. begin
  80.    CurAddr := hex_to_long(copy(CurLine,2,4))*16 +
  81.               hex_to_long(copy(CurLine,7,4));
  82.  
  83.    NewSegment := copy(CurLine,2,4) <> copy(NextLine,2,4);
  84.    if NewSegment then
  85.       NextAddr := hex_to_long(copy(NextLine,2,4))*16
  86.    else
  87.       NextAddr := hex_to_long(copy(NextLine,2,4))*16 +
  88.                   hex_to_long(copy(NextLine,7,4));
  89.  
  90.    writeln(CurSeg:20,'  ',copy(CurLine,1,13),NextAddr-CurAddr:7,' ',copy(CurLine,15,99));
  91.  
  92.    if NewSegment then
  93.    begin
  94.       writeln;
  95.       writeln;
  96.       writeln(' Segment               Location       Size    Symbol');
  97.       writeln;
  98.       determine_segment(hex_to_long(copy(NextLine,2,4)));
  99.       Overhead := hex_to_long(copy(NextLine,7,4));
  100.       if Overhead > 0 then
  101.          writeln(CurSeg:20,'  ',copy(NextLine,1,5),':0000   ',Overhead:7,'    <overhead>');
  102.    end;
  103. end;
  104.  
  105.  
  106. begin
  107.    if paramcount <> 1 then
  108.    begin
  109.       writeln('Usage: mapsize {file}.MAP [>outfile]');
  110.       halt;
  111.    end;
  112.  
  113.    assign(fd,paramstr(1));
  114.    {$i-} reset(fd); {$i+}
  115.    if ioresult <> 0 then
  116.    begin
  117.       writeln('Can''t open: ',paramstr(1));
  118.       halt;
  119.    end;
  120.  
  121.    repeat
  122.       readln(fd,CurLine);
  123.    until CurLine = ' Start  Stop   Length Name               Class';
  124.    readln(fd);
  125.  
  126.    segments := 0;
  127.    readln(fd,CurLine);
  128.    while length(CurLine) > 40 do
  129.    begin
  130.       process_segment;
  131.       readln(fd,CurLine);
  132.    end;
  133.  
  134.    curseg := '';
  135.    writeln;
  136.    writeln(' Segment               Location       Size    Symbol');
  137.    writeln;
  138.  
  139.    repeat
  140.       readln(fd,CurLine);
  141.    until CurLine = '  Address         Publics by Value';
  142.    readln(fd);
  143.  
  144.    readln(fd,CurLine);
  145.    determine_segment(hex_to_long(copy(CurLine,2,4)));
  146.  
  147.    readln(fd,NextLine);
  148.  
  149.    repeat
  150.       process_item;
  151.       CurLine := NextLine;
  152.       readln(fd,NextLine);
  153.    until NextLine = '';
  154.  
  155.    close(fd);
  156. end.
  157.  
  158.  
  159.